package com.file.system.plugin.validated;

import com.file.system.entity.res.CommonResult;
import com.file.system.entity.res.BaseCode;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 全局参数验证异常处理器
 */
@RestControllerAdvice
public class GlobalExceptionHandler {
    /**
     * 参数为实体类
     */
    @ExceptionHandler(value = MethodArgumentNotValidException.class)
    public CommonResult<List<String>> handleValidException(MethodArgumentNotValidException e) {
        // 获取参数校验结果
        List<String> errorMessages = e.getBindingResult().getAllErrors().stream()
                // 获取参数校验错误信息
                .map(ObjectError::getDefaultMessage)
                // 将错误信息收集到列表中
                .collect(Collectors.toList());
        // 将错误信息拼接成字符串
        String errorMessage = String.join(",", errorMessages);
        // 返回参数校验失败的结果
        return CommonResult.fail(BaseCode.Common.PARAM_ERROR)
                // 返回参数校验失败的结果，并将错误信息拼接成字符串
                .setText(BaseCode.Common.PARAM_ERROR.getMessage() + "," + errorMessage);
    }

    /**
     * 参数为单个参数或多个参数
     */
    @ExceptionHandler(value = ConstraintViolationException.class)
    public CommonResult<List<String>> handleConstraintViolationException(ConstraintViolationException e) {
        // 获取参数校验结果
        List<String> errorMessages = e.getConstraintViolations().stream()
                // 获取参数校验错误信息
                .map(ConstraintViolation::getMessage)
                // 将错误信息收集到列表中
                .collect(Collectors.toList());
        // 将错误信息拼接成字符串
        String errorMessage = String.join(",", errorMessages);
        // 返回参数校验失败的结果
        return CommonResult.fail(BaseCode.Common.PARAM_ERROR)
                // 返回参数校验失败的结果，并将错误信息拼接成字符串
                .setText(BaseCode.Common.PARAM_ERROR.getMessage() + "," + errorMessage);
    }

}